#include "CGameTime.h"

CGameTime* CGameTime::m_instance = NULL;

//////////////////////////////////////////////////////////////////////////
/// Private Constructor
//////////////////////////////////////////////////////////////////////////
CGameTime::CGameTime(void)
{
	// is there a performance counter available
	if(QueryPerformanceFrequency((LARGE_INTEGER*)&m_countPerSecond))
	{
		m_perFreq = true;
		m_timeFactor = 1/(float)m_countPerSecond;
		QueryPerformanceCounter((LARGE_INTEGER*)&m_lastTime);
	}
	else
	{
		// no performance counter
		// using timeGetTime
		m_lastTime = timeGetTime();
		// set scaling factor
		m_timeFactor = 0.001;
		m_perFreq = false;

	}
	m_currentTime = 0;
	m_numFrames++;
	m_fps = 0;
}

//////////////////////////////////////////////////////////////////////////

CGameTime::~CGameTime(void)
{
}

//////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////
/// Get FPS
//////////////////////////////////////////////////////////////////////////
float CGameTime::GetFPS()
{
	return m_fps;
}

//////////////////////////////////////////////////////////////////////////
/// Update
//////////////////////////////////////////////////////////////////////////
void CGameTime::Update(float fpsLimit)
{
	float timeElapsed = 0.0f;
	do 
	{
		// get current time
		if(m_perFreq == true)
		{
			QueryPerformanceCounter((LARGE_INTEGER*)&m_currentTime);
		}
		else
		{
			m_currentTime = timeGetTime();
		}

		m_deltaTime = (float)(m_currentTime - m_lastTime)/(float)m_countPerSecond;
		timeElapsed += m_deltaTime;
		m_numFrames++;
		if(timeElapsed > 1.0f)
		{
			m_fps = m_numFrames;
			m_numFrames = 0;
			timeElapsed = 0;
		}
		m_lastTime = m_currentTime;
	} while (m_fps > fpsLimit);
	
}

//////////////////////////////////////////////////////////////////////////
/// Get instance of this class
//////////////////////////////////////////////////////////////////////////
CGameTime* CGameTime::GetInstance()
{
	if(m_instance == NULL)
	{
		m_instance = new CGameTime();
	}
	return m_instance;
}
